package site.wlwsjsx.iot_backend.mapper;

import org.apache.ibatis.annotations.Param;
import site.wlwsjsx.iot_backend.entity.WorkstationEnv;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 工位环境数据 Mapper 接口
 * 对应表：workstation_env
 */
public interface WorkstationEnvMapper {

    /**
     * 新增工位环境数据（传感器采集数据入库）
     *
     * @param workstationEnv 工位环境数据对象（id自增，createTime可由数据库自动填充）
     * @return 受影响行数（成功为1）
     */
    int insert(WorkstationEnv workstationEnv);

    /**
     * 根据工位编号查询最新一条环境数据（实时状态查询）
     *
     * @param workstationCode 工位编号（如：302-01）
     * @return 最新环境数据，无数据返回null
     */
    WorkstationEnv selectLatestByCode(@Param("workstationCode") String workstationCode);

    /**
     * 根据工位编号分页查询历史环境数据（不带时间范围）
     *
     * @param workstationCode 工位编号
     * @param offset          分页偏移量（(pageNum-1)*pageSize）
     * @param pageSize        每页条数
     * @return 历史数据列表，无数据返回空列表
     */
    List<WorkstationEnv> selectHistoryByCode(
            @Param("workstationCode") String workstationCode,
            @Param("offset") int offset,
            @Param("pageSize") int pageSize
    );

    /**
     * 根据工位编号和时间范围分页查询历史环境数据（带筛选）
     *
     * @param workstationCode 工位编号
     * @param startTime       开始时间（如：2024-09-24 00:00:00）
     * @param endTime         结束时间（如：2024-09-24 23:59:59）
     * @param offset          分页偏移量
     * @param pageSize        每页条数
     * @return 筛选后的历史数据列表
     */
    List<WorkstationEnv> selectHistoryByCodeAndTime(
            @Param("workstationCode") String workstationCode,
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("offset") int offset,
            @Param("pageSize") int pageSize
    );

    /**
     * 查询符合条件的历史数据总条数（分页配套使用）
     *
     * @param workstationCode 工位编号
     * @param startTime       开始时间（可为null，null时不筛选）
     * @param endTime         结束时间（可为null，null时不筛选）
     * @return 总记录数
     */
    Long countHistoryByCondition(
            @Param("workstationCode") String workstationCode,
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime
    );

    /**
     * 根据实验室ID查询下属所有工位的最新环境数据（实验室维度监控）
     *
     * @param labId 实验室ID（需配合工位编号规则，如：302开头的工位属于ID=302的实验室）
     * @return 该实验室下所有工位的最新数据列表
     */
    List<WorkstationEnv> selectAllLatestByLabId(@Param("labId") Integer labId);
}